package p.a2.a;

/*
 * @author: Stefan Schasse 569372
 */

/*****************************************************
 *
 * Optimierung nach http://www.markdiamond.com.au/download/joous-3-1-1.pdf
 * Ziffer 0 in Zahl: Produkt ist 0 Ziffer 1 in Zahl: Es gibt ein kleinere Zahl
 * mit gleichem Produkt http://oeis.org/A003001: solutions: The smallest numbers
 * having multiplicative persistences of 1, 2, ... are 10, 25, 39, 77, 679,
 * 6788, 68889, 2677889, 26888999, 3778888999, 277777788888899
 *
 *
 ***************************************************/

public class QuerPrime {
	
	public static long constructnumber(int p2, int p3, int p5, int p7) {
		boolean shortcut = false;
		String number = "";
		String ziffer = "";
		Long result = 0L;
		int d = 0;
		int[] p = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
		p[2] = p2;
		p[3] = p3;
		p[5] = p5;
		p[7] = p7;
		
		// outp(p);
		p[8] = p[8] + (p[2] / 3);
		p[2] = p[2] % 3;
		// outp(p);
		p[9] = p[9] + (p[3] / 2);
		p[3] = p[3] % 2;
		// outp(p);
		d = Math.min(p[2], p[3]);
		p[6] = p[6] + d;
		p[2] = p[2] - d;
		p[3] = p[3] - d;
		// outp(p);
		p[4] = p[4] + (p[2] / 2);
		p[2] = p[2] % 2;
		// outp(p);
		
		for (int i = 1; i < 10; i++) {
			if (p[i] > 0) {
				ziffer = "" + i;
				for (int k = 0; k < p[i]; k++) {
					number = number + ziffer;
					// System.out.println("" + i + " (" + ziffer + "):" +
					// number);
				}
			}
		}
		// System.out.println("Number String: " + number);
		if ((number.contains("0")) | (number.contains("1"))) {
			// shortcut = true;
		}
		if ((number.contains("2")) & (number.contains("5"))) {
			shortcut = true;
		}
		if ((shortcut == true) | (number == "")) {
			result = 0L;
		} else {
			result = 0L;
			for (int i = 0; i < number.length(); i++) {
				result = result + ((long) Math.pow(10, i) * Integer.parseInt(number.substring(i, i + 1)));
			}
		}
		// result=(long)
		// (Math.pow(2,p2)*Math.pow(3,p3)*Math.pow(5,p5)*Math.pow(7,p7));
		// System.out.println(" Result:"+result);
		return result;
	}
	
	public static void outp(int[] p) {
		for (int i = 0; i < 10; i++) {
			System.out.print(p[i] + " ");
		}
		;
		System.out.println("");
	}
	
	public static int qp(long zahl) {
		int grad = 0;
		long produkt = 0;
		long z = zahl;
		do { // schleife zum k(x) berechnen
			produkt = 1; // produkt initialisieren
			grad++; // grad hochzählen
			while (z != 0) { // solange die zahl noch nicht verarbeitet wurde
				produkt = Math.round(produkt * (z % 10)); // produkt mit letzter
				// ziffer
				// mutliplizieren (modulo10 rest
				z = Math.round(z / 10); // letzte ziffer streichen (durch 10
				// teilen integer)
				System.out.println("x:" + zahl + "/" + z + " produkt:" + produkt + " g:" + grad);
			}
			z = produkt;
		} while (produkt >= 10); // schleife solange bis das Querrodukt
		// einstellig ist
		// System.out.println("x:" + zahl + " produkt:" + produkt + " g:" +
		// grad);
		return grad;
	}
	
	public static boolean factorize(long zahl) {
		boolean answer = false;
		int z = 0;
		int[] prime = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
		while ((zahl != 0) & (answer == false)) { // alle stellen durchgehen
			// solang keine abbruchbed
			// gefunden
			z = (int) zahl % 10;
			if ((z == 0) || (z == 1) || (z == 2) || (z == 3) || (z == 5) || (z == 7)) {
				prime[z]++;
			} else
				if (z == 4) {
					prime[2] = prime[2] + 2;
				} else
					if (z == 6) {
						prime[2]++;
						prime[3]++;
					} else
						if (z == 8) {
							prime[2] = prime[2] + 3;
						} else
							if (z == 9) {
								prime[3] = prime[3] + 2;
							}
			;
			zahl = zahl /= 10; // stelle wegstreichen
		}
		// System.out.println(" "+answer);
		return answer;
	}
	
	public static boolean shortcut(int p2, int p3, int p5, int p7, long zahl) {
		boolean answer = false;
		int z = 0;
		if ((p2 > 0) & (p5 > 0)) {
			answer = true; // abbruch mARKIEREN
		} else {
			while (zahl != 0) {
				// System.out.print(zahl+": ");
				z = (int) zahl % 10;
				if ((z == 1) | (z == 0)) { // abbruch wenn eine stelle eine 0
					// oder 1 enthält (s.o.)
					answer = true; // abbruch mARKIEREN
					break;
				}
				zahl = zahl /= 10; // stelle wegstreichen
			}
		}
		return answer;
	}
	
	public static void main(String[] args) {
		int Kmax = Integer.parseInt(args[0]); // argumentenübername
		long zahl, dummy = 0;
		long[] result = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
		
		int mp = 0;
		int MaxExp = 4;
		long startZeit = System.currentTimeMillis(); // stopuhr
		// System.out.println("Start:"+startZeit);
		dummy = constructnumber(1, 0, 1, 0);
		System.out.println(dummy);
		System.out.println(qp(dummy));
		
		System.exit(-1);
		
		/*
		 * int p2,p3,p5,p7=0; for (int t=0; t<30; t++) { p2=(int) (Math.random()
		 * * 10); p3=(int) (Math.random() * 10); p5=(int) (Math.random() * 10);
		 * p7=(int) (Math.random() * 10);
		 * System.out.println("Random: "+p2+" "+p3+" "+p5+" "+p7);
		 * zahl=constructnumber(p2,p3,p5,p7);
		 */
		for (int p2 = 0; p2 < MaxExp; p2++) {
			for (int p3 = 0; p3 < MaxExp; p3++) {
				for (int p7 = 0; p7 < MaxExp; p7++) {
					if (p2 == 0) {
						for (int p5 = 0; p5 < MaxExp; p5++) {
							
							zahl = constructnumber(p2, p3, p5, p7);
							System.out.print("2:" + p2 + " 3:" + p3 + " 5:" + p5 + " 7:" + p7 + " z:" + zahl);
							// if (shortcut(p2, p3, p5, p7, zahl) == false) { //
							// notwendigkeit
							// der
							// berechnung
							// prüfen
							mp = qp(zahl);
							System.out.print(" mp:" + mp);
							if ((result[mp] == 0) | (result[mp] > zahl)) {
								System.out.println(" NEW");
								result[mp] = zahl;
							} else {
								System.out.println("");
							}
							
							// } else {
							// System.out.println(" SHORTCUT");
							// mp = 0; // qp(x); // oder halt auch nicht
							
							// }
						}
					} else {
						zahl = constructnumber(p2, p3, 0, p7);
						System.out.print("2:" + p2 + " 3:" + p3 + " 5:" + 0 + " 7:" + p7 + " z:" + zahl);
						mp = qp(zahl);
						System.out.print(" mp:" + mp);
						if ((result[mp] == 0) | (result[mp] > zahl)) {
							System.out.println(" NEW");
							result[mp] = zahl;
						} else {
							System.out.println("");
						}
					}
				}
			}
		}
		
		for (int k = 1; k <= Kmax; k++) { // schleife k durchzählen bis kmax
			System.out.println(k + " Schritte: " + result[k] + " Zeit:" + ((System.currentTimeMillis() - startZeit)));
		}
		
	}
}